package com.xyz.findScorebyName;

import com.sun.tools.javac.util.List;

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        List<Student> list = List.of(
                new Student("Bob", 78),
                new Student("Alice", 85),
                new Student("Brush", 66),
                new Student("Newton", 99));
        Students holder = new Students(list);
        System.out.println(holder.getScore("Bob") == 78 ? "测试成功!" : "测试失败!");
        System.out.println(holder.getScore("Alice") == 85 ? "测试成功!" : "测试失败!");
        System.out.println(holder.getScore("Tom") == -1 ? "测试成功!" : "测试失败!");
    }
}

//学生集合类
//包含两个集合作为它的字段
class Students {
    //学生列表结合
    List<Student> list;
    //映射集合，充当缓冲区
    Map<String, Integer> cache;

    //构造函数中，获取学生列表作为参数，初始化学生列表字段
    //第二个映射集合字段初始为空
    Students(List<Student> list) {
        this.list = list;
        cache = new HashMap<>();
    }

    /**
     * 根据name查找score，找到返回score，未找到返回-1
     */
    int getScore(String name) {
        // 先在Map中查找:
        Integer score = this.cache.get(name);

        if (score == null) {
            // TODO:
            //第一运行时，因为 cache 在构造函数中并没有初始化，其中没有任何项
            //所以在这里，需要遍历 list , 向 cache 映射集合中添加值
            for (Student s : this.list) {
                //将学生名作为 key ，学生成绩作为 value
                //对 cache 中的每个映射赋值
                cache.put(s.name,s.score);
            }
            score = this.cache.get(name);

        }
        return score == null ? -1 : score.intValue();
    }

    Integer findInList(String name) {
        for (Student ss : this.list) {
            if (ss.name.equals(name)) {
                return ss.score;
            }
        }
        return null;
    }
}

// 基本元素类
class Student {
    String name;
    //成绩
    int score;

    Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
}